package plp.expressions1.expression;

import plp.expressions1.util.Tipo;
import plp.expressions1.util.TipoPrimitivo;

public abstract class ExpAlgebricaAbstract extends ExpBinaria{

	public ExpAlgebricaAbstract(Expressao esq, Expressao dir, String operador) {
		super(esq, dir, operador);
	}

	/**
	 * Retorna os tipos possiveis desta expressao.
	 *
	 * @return os tipos possiveis desta expressao.
	 */
	public Tipo getTipo() {
		if (getEsq().getTipo().eReal()) {
			return TipoPrimitivo.REAL;
		}else if(getEsq().getTipo().eInteiro()){
			return TipoPrimitivo.INTEIRO;
		}
		
		return null;
	}

	/**
	 * Realiza a verificacao de tipos desta expressao.
	 *
	 * @return <code>true</code> se os tipos da expressao sao validos;
	 *          <code>false</code> caso contrario.
	 */
	protected boolean checaTipoElementoTerminal() {
		if (getEsq().getTipo().eReal()) {
			return (getEsq().getTipo().eReal() && getDir().getTipo().eReal());
		}else if(getEsq().getTipo().eInteiro()){
			return (getEsq().getTipo().eInteiro() && getDir().getTipo().eInteiro());
		}
		
		return false;
	}

	
	/**
	 * Retorna o valor da Expressao de Soma
	 */
	public abstract Valor avaliar();
}
